#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main()
{
	int math[10] = { 0,1,2,3,4,5,6,7,8,9 };//数组有10个元素，每个元素的类型都是int
	int math2[10] = { 0,1,2,3,4 };//不完全初始化，剩下的元素默认初始化为0
	char ch[5] = { 'a','b','c' };//剩下的元素默认初始化0，用'\0'这样形式表示，补了3个'\0'
	//因为0~31的32个字符不可见，所以排位0的字符如果要表示，肯定不能它原本地表示出来，用八进制的"'\0'表示
	char ch2[5] = "abc";//字符数组里面最后合成后都是字符串，因此可以直接字符串初始化，因为字符串本身有个
	//没写出来的'\0'，所以最后一共补了1个'\0'
	double arr[6] = { 0.0 };//后面补了5个0.0
	//该数组的类型是 - double[6] (把名字arr去掉等号左边的),由元素类型与元素个数组成
	
  //数组元素的下标: 0,1,2,3,4,5,6,7,8,9        
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };//这里的[]指定数组的元素个数的
	printf("%d\n", arr1[5]);//这里的[] -- 下标引用操作符

	//当对数组进行初始化的时候，数组的大小可以省略，编译器会根据数组的初始化内容，自动计算数组的元素个数
	int arr2[] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;
	for (i = 0;i < 10;i++)
	{
		printf("%d ", arr2[i]);
	}
	printf("\n");

	i = 0;
	while (i < 10)
	{
		printf("%d ", arr2[i]);
		i++;
	}
	printf("\n");

	i = 0;
	int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0;i < 10;i++)
	{
		scanf("%d", &arr3[i]);//arr3[i]一个元素一个变量，arr3[]元素集合变量集合，arr3名才是数组地址
	}
	i = 0;
	for (i = 0;i < 10;i++)
	{
		printf("%d ", arr3[i]);
	}
	printf("\n");

	for (i = 0;i < 10;i++)
	{
		printf("&arr3[%d]=%p\n ",i, &arr3[i]);//&-取地址操作符-取出变量在内存中的地址
	}

	int arr4[] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%zd\n", sizeof(arr4));//计算的是数组的大小=40字节=10*4（sizeof(int)）
	int sz = sizeof(arr4) / sizeof(arr4[0]);
	printf("%d\n", sz);//计算数组元素个数
	i = 0;
	for (i = 0;i < sz;i++)
	{
		printf("%d ", arr4[i]);
	}printf("\n");

	int data1[3][5] = { {1,2},{3,4},{ 5,6 } };//3行5列，此二维数组由3个数组组成，每一行一个数组，每个数组由5个整型元素组成
	int data2[][5] = { 1,2,3,4,5,6,7,8 };//不完全初始化时，行可以省略，列不能省略
	int data3[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7, };
	printf("%d\n", data3[2][4]);

	int data4[3][5] = { 0 };
	i = 0;
	int j = 0;
	for (i = 0;i < 3;i++)
	{
		for (j = 0;j < 5;j++)
		{
			scanf("%d", &data4[i][j]);
		}
	}
	i = 0;
	j = 0;
	for (i = 0;i < 3;i++)
	{
		for (j = 0;j < 5;j++)
		{
			printf("%d ", data4[i][j]);
		}
		printf("\n");
	}

	int data5[3][5] = { 0 };
	i = 0;
	j = 0;
	for (i = 0;i < 3;i++)
	{
		for (j = 0;j < 5;j++)
		{
			printf("arr5[%d][%d]=%p\n",i,j, &data5[i][j]);
		}
	}
	int data6[3][5] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
	//1,2,3,4,5
	//6,7,8,9,10
	//11,12,13,14,15
	i = 0;
	j = 0;
	for (i = 0;i < 5;i++)
	{
		for (j = 0;j< 3;j++)
		{
			printf("%d ", data6[j][i]);//这样就按着竖的内容打印了，打印顺序都是从左到右
		}
		printf("\n");
	}

	char a[] = "abc";// a b c \0
	printf("%d\n", strlen(a));//算"\0"前字符个数

	char b[] = "hello bit!!!!!!!!!!!!!!!!!";
	char c[] = "##########################";
	int left = 0;
	int right = strlen(b) - 1;
	while (left <= right)
	{
		c[left] = b[left];
		c[right] = b[right];
		printf("%s\n", c);
		Sleep(1000);//停顿1000毫秒
		system("cls");//清理控制台屏幕的信息
		left++;
		right--;
	}printf("%s\n", c);

	int d[] = { 1,2,3,4 };
	printf("%d\n", strlen(d)-1);//整型数字集合，并没有字符，strlen是求字符串长度的，只能针对字符串或者字符数组
	int e = sizeof(d) / sizeof(d[0]);//所有元素总内存大小/一个元素内存大小=元素个数
	printf("%d\n", e-1);//总元素个数-1=数组最右元素下标

	char f[] = { "abcd" };
	printf("%d\n", strlen(f) - 1);//字符元素总个数-1=字符数组最右元素下标
	int g = sizeof(f) / sizeof(f[0]);//sizeof会算'\0'字符内存，所以算的个数是4+1=5
	printf("%d\n", g);
	//int flag =0;
	int h[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf("%d", &k);
	int l = sizeof(h) / sizeof(h[0]);
	int left1 = 0;
	int right1 = l - 1;
	while (left1<=right1)
	{
		int mid = (left1 + right1) / 2;
		if (h[mid] > k)
		{
			right1 = mid - 1;
		}
		else if (h[mid]<k)
		{
			left1 = mid + 1;
		}
		else
		{
			printf("找到了，该数下标是%d\n", mid);
			//falg=1;
			break;
		}
	}
	if (left1 >right1)//if (!flag)
		printf("找不到该数\n");
	return 0;
}

//1

                 //没有直接的字符串数组
int main()//总大元素没限制于类型
//char str[3][21] = {"hello","bite","world"};
{//一共3个总大元素，每个总大元素由此类型元素组成的数组构成
    int a;
    scanf("%d",&a);
    int arr[]={61,71,11,21,32,19,27,31};
    //一个字符数组放一堆字符元素，总效果是放合起来的一个字符串
    char brr[20];
//元素类型
  
            //已成数组，char[20] = "abcd" 可以不放满
    char str[8][20] = {"Brasilia","Salvador","Sao Paulo","Rio de Janeiro","Juiz de Fora","Campinas","Vitoria","Belo Horizonte"};
    //二维数组已是数组元素数组
    int i;
    int count = 0;
    for(i=0;i<8;i++)
    {
        if(a==arr[i])
        {               //str是字符串数组首元素即首个字符串地址
            printf("%s",*(str+i));
            count = 1;
        }
    }
    if(count != 1)
    printf("DDD nao cadastrado");
    return 0;
}


//2


//int row, col;
//void juzhen(int(*p)[col], int row, int col)
//{         //a还是a
//    for (int i = 0;i < row;i++)
//    {
//        for (int j = 0;j < col;j++)
//        {
//            printf("%d ", *(*p + j));
//        }
//        printf("\n");
//        p++;
//    }
//}
//int main()
//{
//    scanf("%d %d", &row, &col);
//    int a[row][col];
//    for (int i = 0;i < row;i++)
//    {
//        for (int j = 0;j < col;j++)
//        {
//            scanf("%d", &a[i][j]);
//        }
//    }
//    juzhen(a, row, col);
//    return 0;
//}

//       //形参这边可不初始化创建空形式二维数组，它是真不确定的，能直接应对任何
//void juzhen(int a[][100], int row, int col) 
//{  
//    for (int i = 0; i < row; i++) 
//    {
//        for (int j = 0; j < col; j++) 
//        {
//            printf("%d ", a[i][j]); 
//        }
//        printf("\n");
//    }
//}

//int main()
//{
//    int a[2][3];
//    int c[] = { 1,2,3 };//写成空的有初始化等于没空，空形式但实际没空
//    int b[][3] = { 1 };//二维数组列处不能空形式，因为二维数组初始化确定空形式写省略至少要有一个在确定的，规定是列
//    return 0;
//}